interface VisiteurMaison {                       //  interface du visiteur
    void visite(Cuisine cuisine);
    void visite(Chambre chambre);
    void visite(Maison maison);
    void visite(Armoire armoire);
    void visite(Garage garage);
    void visite(Voiture voiture);
}

interface ElementDeMaison {                              // Interface pour chacun des elements
    void accept(VisiteurMaison visitor);                 // de la maison
}

class Cuisine implements ElementDeMaison{                 // Cuisine
    private int taille ;
    public Cuisine(int taille) {
        this.taille = taille;
    }
    public int getTaille() {
        return this.taille;
    }
    public void setTaille(int taille){
        this.taille = taille;
    }    
    public void accept(VisiteurMaison visitor) {
        visitor.visite(this);
    }
}
 
class Chambre implements ElementDeMaison {                // Chambre
    private int taille ;
    public Chambre(int taille){
        this.taille = taille ;
    }
    public int getTaille(){
        return taille ;
    }
    public void setTaille(int taille){
        this.taille = taille ;
    }
    public void accept(VisiteurMaison visitor) {
        visitor.visite(this);
    }
}
 
class Armoire implements ElementDeMaison {                // Armoire 
    private String nom ;
    private int cases ;
    public Armoire(String nom, int cases){
        this.nom = nom ;
        this.cases = cases ;
    }
    public int getCases(){
        return cases;
    }
    public void setCases(int cases){
        this.cases = cases ;
    }
    public String getNom(){
        return nom ;
    }
    public void setNom(String nom){
        this.nom = nom ;
    }
    public void accept(VisiteurMaison visitor) {
        visitor.visite(this);
    }
}
 
class Garage implements ElementDeMaison {                   // Garage
    private int taille ;
    public Garage(int taille){
        this.taille = taille ;
    }
    public int getTaille(){
        return taille ;
    }
    public void accept(VisiteurMaison visitor){
        visitor.visite(this);
    }
}
class Voiture implements ElementDeMaison {                  // Wouature !
    private String marque ;
    public Voiture (String marque){
        this.marque = marque ;
    }
    public String getMarque(){
        return this.marque ;
    }
    public void setMarque(String marque){
        this.marque = marque ;
    }
    public void accept(VisiteurMaison visitor){
        visitor.visite(this);
    }
}

class Maison implements ElementDeMaison{
    ElementDeMaison[] elements;                          // Contient tout les element de la maison
                                                         // Cuisine, Chambre, Armoire, Voiture, Garage
    public Maison() {
        this.elements = new ElementDeMaison[]
          { 
            new Cuisine(20), new Garage(30),
            new Armoire("Commode", 10), new Armoire("etagere", 15),
            new Voiture("Peugeot 206"), new Chambre(50)                    
          };
    }
    
    public ElementDeMaison[] getElements() {             
        return elements.clone();                    // Return a copy of the array of references.
    }
    public String toString(){
		return "\nLa maison possède en tout: \n - une cuisine \n - un garage \n - deux armoires \n - une voiture \n - une chambre" ;
		
	}


    public void accept(VisiteurMaison visitor) {	        
        for(ElementDeMaison element : this.getElements()){
            element.accept(visitor);
        }
        visitor.visite(this);	
    }
 
}
class VisiteurElementDeMaison implements VisiteurMaison {
    public void visite(Maison maison){
        System.out.println(maison);
    }
    public void visite(Cuisine cuisine){      
        System.out.println("Visite de la cuisine "+ cuisine.getTaille() + " m²");
    }
    public void visite(Armoire armoire){
       System.out.println("Visite d'une armoire intitulé " + armoire.getNom());
       System.out.println("Nombre de cases de cette armoire : " + armoire.getCases());  
    }
    public void visite(Garage garage){
        System.out.println("Visite du garage " + garage.getTaille() + " m²"); 
    }
    public void visite(Voiture voiture){
        System.out.println("Visite de la voiture qui est de la marque " + voiture.getMarque()); 
    }
    public void visite(Chambre chambre){
        System.out.println("Visite de la chambre qui fait " + chambre.getTaille() + " m²"); 
    }

}
/*
class Visiteur implements VisiteurMaison {
    public void visite(Maison maison){
        System.out.println("Visite de la maison" );
    }
    public void visite(Cuisine cuisine){      
        System.out.println("Visite de la cuisine");
    }
    public void visite(Chambre chambre){
        System.out.println("Visite de la chambre"); 
    }
    public void visite(Armoire armoire){
        System.out.println("Visite armoire");
    }
    public void visite(Garage garage){
        System.out.println("Visite du garage"); 
    }
    public void visite(Voiture voiture){
        System.out.println("Visite de la voiture"); 
    }

 
}
*/ 
public class VisiteurDem {
    static public void main(String[] args){
        Maison maison = new Maison();
        //maison.accept(new Visiteur());
		
        maison.accept(new VisiteurElementDeMaison());
		System.out.println("Visite des classes terminées !  \n ") ;

    }
}

